package cn.tedu.micro.demo.emqx.client;

import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;

/**
 * 不同的业务可以通过这个类发送他们的业务消息
 * T 泛型表示在不同业务中发送的不同消息数据类型
 * 序列化方式 也使用java-json-byte[]
 * 反序列化 byte[]-json-java
 */
@Component
@Slf4j
public class MqttProducerClient<T> {
    //根据需求 定义的一些send方法
    /* send方法 默认发送
       String destination: 主题
       T message: 业务消息数据
       qos: 默认1
       retained: 默认true
     */
    @Autowired
    private MqttClient client;
    public void send(String destination,T message){
        this.send(destination,message,1,true);
    }
    public void send(String topic,T message,int qos,boolean retain){
        try{
            client.publish(topic,serializser(message),qos,retain);
        }catch (Exception e){
            log.error("发送目标:{},消息:{},失败",topic,message,e);
        }
    }

    //序列化方法serializer
    public static <T> byte[] serializser(T msg){
        //1.所有消息类型 转化成json 字符串 获取byte属性
        return JSON.toJSONString(msg).getBytes(StandardCharsets.UTF_8);
    }
    //反序列化方法deserializer
    public static <T> T deserializer(byte[] body,Class<T> clazz){
        //将body转化成字符串 解析对象
        String json = new String(body, StandardCharsets.UTF_8);
        return JSON.parseObject(json, clazz);
    }
}
